<?php

class CotizacionsController extends AppController {

    var $name = 'Cotizacions';
    var $uses = array('Cotizacion', 'CotizacionDetalle', 'Material', 'Lapso', 'Cliente', 'Usuario');
    var $components = array('Vista', 'Maestro', 'Interfaz');
    var $helpers = array('Interfaz', 'Paginator', 'Formulario');
    var $layout = "ajax";
    var $paginate = array('limit' => 10, 'order' => array('Cotizacion.id' => 'DESC'));

    public function beforeFilter() {
        $this->validar_sesion();
    }
    
    public function afterFilter() {
        $this->auditoria();
    }

    public function index($busqueda = null) {
        extract($this->request->data);
        $data = null;
        $idCliente = null;
        $condiciones = array();
        $condicionesModelo = array();
        $condicionesCliente = array();
        $condiciones['Cotizacion.estatus !='] = 0;
        
        if (!empty($fechaInicio))
            $condiciones['DATE(Cotizacion.fecha) BETWEEN ? AND ?'] = array($fechaInicio, $fechaFin);
        
        if (!empty($busqueda)) {
            $condicionesModelo['Cotizacion.numero ILIKE'] = "%$busqueda%";
            $idCliente = $this->Cliente->buscar_clientes($busqueda);
            if (!empty($idCliente))
                $condicionesCliente['Cotizacion.cliente_id'] = $idCliente;
        } else {
            if(!empty($punto_id))
                $condiciones['Cotizacion.punto_id'] = $punto_id;
        }
        
        /*if (!empty($idCliente))
            $condicionesCliente['Cotizacion.cliente_id'] = $idCliente;*/
        
        if(!empty($selectFD))
            $condiciones['Cotizacion.estatus'] = $selectFD;

        $tiendaSesion = $this->Session->read('tiendaBD');
        $objCot = $this->Maestro->modelo('punto', 'Cotizacion', $tiendaSesion);
        $data = $this->paginate($objCot, array($condiciones, 'OR' => array($condicionesModelo, $condicionesCliente)));

        $this->set('url', $busqueda);
        $this->set('data', $data);
    }

    public function historial() {
        extract($this->request->data);
        $data = null;
        $condiciones['DATE(Cotizacion.fecha) BETWEEN ? AND ?'] = array(date('Y-m-d', strtotime('-3 day', strtotime(date('Y-m-d')))), date('Y-m-d'));
        
        if(!empty($selectFD))
            $condiciones['Cotizacion.estatus'] = $selectFD;
        
        if(!empty($punto_id))
            $condiciones['Cotizacion.punto_id'] = $punto_id;
            
        $tiendaSesion = $this->Session->read('tiendaBD');
        $objCot = $this->Maestro->modelo('punto', 'Cotizacion', $tiendaSesion);
        $data = $this->paginate($objCot, array($condiciones));

        $this->set('data', $data);
    }

    public function logs() {
        extract($this->request->data);
        $idCot = $this->Interfaz->id($idCot);

        $tiendaSesion = $this->Session->read('tiendaBD');
        $objCot = $this->Maestro->modelo('punto', 'Cotizacion', $tiendaSesion);
       
        $logCotizaciones = $objCot->query("SELECT * FROM fnc_log_documento($idCot,'COT') AS (id integer,documento character varying,fecha timestamp without time zone,tipo integer,descripcion character varying);");
   
        $this->set('log', $logCotizaciones);
    }

    public function detalle() {
        extract($this->request->data);
        $id = $this->Interfaz->id($id);
        $tiendaSesion = $this->Session->read('tiendaBD');
        $objCot = $this->Maestro->modelo('punto', 'Cotizacion', $tiendaSesion);
        $data = $objCot->find('first', array('conditions' => array('Cotizacion.id' => $id)));
        list($fecha) = explode(' ', $data['Cotizacion']['fecha']);
        $fechaInvertida = implode('-', array_reverse(explode('-', $fecha)));
        $productos = $objCot->query("select * FROM fnc_obtener_existencia_material_venta($id, '" . $fechaInvertida . "', 'C')");

        $datosUsuario = $this->Usuario->find('first', array('fields' => 'Usuario.usuario', 'conditions' => array('Usuario.id' => $data['Cotizacion']['usuario_id'])));

        $this->set('url', $id);
        $this->set('data', $data);
        $this->set('usuario', $datosUsuario['Usuario']['usuario']);
        $this->set('productos', $productos);
        $this->set('tienda', $tiendaSesion);
    }

    public function guardar() {
        extract($this->request->data);
        $productos = json_decode($productos, true);
        $cantidades = json_decode($cantidades, true);
        $nuevoID = str_replace('-', '', $num_form);
        $fecha = "fecha_$nuevoID";
        $programa_id = "programa_id_$nuevoID";
        $programa_id = $$programa_id;
        $tipodeventa = "tipodeventa_$nuevoID";
        $tipodeventa = $$tipodeventa;
        $lapso_id = "lapso_id_$nuevoID";
        $lapso_id = $$lapso_id;
        $fechaFinal = $$fecha;
        $fechaGuardar = "$fechaFinal " . date('h:i:s');
        $lapso_id = (!empty($lapso_id)) ? $lapso_id : 1;
        $cotizacion['numcot'] = '001';
        $cotizacion['cliente_id'] = $this->Interfaz->id($this->request->data['id2']);
        $cotizacion['usuario_id'] = $this->Interfaz->id($this->Session->read('usuario_id'));
        $cotizacion['punto_id'] = $this->Session->read('punto_id');
        $cotizacion['tipo_cliente_id'] = (!empty($tipo_cliente_id)) ? $tipo_cliente_id : 1;
        $cotizacion['fecha'] = 'now()';
        $cotizacion['monto'] = $monto;
        $cotizacion['observaciones'] = "CADUCA A LOS TRES (03) DIAS DE EMITIDA";
        if (!empty($observacion))
            $cotizacion['observaciones'] .= " - {$this->Interfaz->mayuscula($observacion)}";
        $cotizacion['tipodeventa'] = $tipodeventa;
        $cotizacion['lapso_id'] = $lapso_id;
        $cotizacion['programa_id'] = $programa_id;
        $cotizacion['tienda_id'] = $this->Interfaz->id($this->Session->read('tienda_id_trabajo'));

        $tiendaSesion = $this->Session->read('tiendaBD');
        $objCot = $this->Maestro->modelo('punto', 'Cotizacion', $tiendaSesion);
        $objCotDet = $this->Maestro->modelo('punto', 'CotizacionDetalle', $tiendaSesion);

        $objCot->query('BEGIN WORK');
        if ($objCot->save($cotizacion)) {
            $detalleProductos = $this->buscar_producto($productos, $cotizacion['tipo_cliente_id'], $programa_id, $lapso_id, $fechaFinal);
            $cotizacionDetalle = array();
            $errores = array();
            foreach ($detalleProductos as $indice => $valor) {
                $idPro = array_search($valor['Material']['id'], $productos);
                $cantSuperv = $cantidades[$idPro] + $valor['Material']['venta'];
                if (
                    ($cantidades[$idPro] > $valor['Material']['existencia']) ||
                    (empty($valor['Material']['existencia'])) ||
                    ($valor['Material']['existencia'] <= 0) ||
                    (empty($valor['Material']['precio'])) ||
                    ($valor['Material']['precio'] <= 0) ||
                    (($valor['Material']['maximo'] > 0) && ($cantSuperv > $valor['Material']['maximo']))
                ) {
                    $errores[$valor['Material']['id']]['error'] = '';
                    if (($cantidades[$idPro] > $valor['Material']['existencia']) || (empty($valor['Material']['existencia'])) || ($valor['Material']['existencia'] <= 0))
                        $errores[$valor['Material']['id']]['error'] = "La Cantidad escogida supera la Existencia";
                    if ((empty($valor['Material']['precio'])) || ($valor['Material']['precio'] <= 0)) {
                        $errores[$valor['Material']['id']]['error'] .= (!empty($errores[$valor['Material']['id']]['error'])) ? '<br/>' : '';
                        $errores[$valor['Material']['id']]['error'] .= "El precio del producto es invalido";
                    }
                    if ($cantSuperv > $valor['Material']['maximo']) {
                        $errores[$valor['Material']['id']]['error'] .= (!empty($errores[$valor['Material']['id']]['error'])) ? '<br/>' : '';
                        $errores[$valor['Material']['id']]['error'] .= "Supera la cantidad maxima permitida de venta";
                    }
                    $errores[$valor['Material']['id']]['nombre'] = "({$valor['Material']['codigo']})<br/>{$valor['Material']['nombre']}";
                    $errores[$valor['Material']['id']]['precio'] = $valor['Material']['precio'];
                    $errores[$valor['Material']['id']]['cantidad'] = $cantidades[$idPro];
                    $errores[$valor['Material']['id']]['existencia'] = $valor['Material']['existencia'];
                    $errores[$valor['Material']['id']]['vendido'] = $cantSuperv;
                    $errores[$valor['Material']['id']]['maximo'] = ($valor['Material']['maximo'] - $valor['Material']['venta']);
                } else {
                    $cotizacionDetalle[$indice]['CotizacionDetalle']['cotizacion_id'] = $objCot->id;
                    $cotizacionDetalle[$indice]['CotizacionDetalle']['material_id'] = $valor['Material']['id'];
                    $cotizacionDetalle[$indice]['CotizacionDetalle']['usuario_id'] = $cotizacion['usuario_id'];
                    $cotizacionDetalle[$indice]['CotizacionDetalle']['almacen_id'] = 1;
                    $cotizacionDetalle[$indice]['CotizacionDetalle']['cantidad'] = $cantidades[$idPro];
                    $cotizacionDetalle[$indice]['CotizacionDetalle']['precio'] = $valor['Material']['precio'];
                    $cotizacionDetalle[$indice]['CotizacionDetalle']['impuesto'] = $valor['Material']['impuesto'];
                }
            }

            if (count($errores) > 0) {
                $objCot->query('ROLLBACK');
                echo json_encode($errores);
            } else {
                if ($objCotDet->saveAll($cotizacionDetalle)) {
                    $tienda = substr($this->Session->read('codigo_punto'), 1);
                    $res = $objCot->query("select fn_numero_cotizacion('$tienda', {$objCot->id}, {$this->Session->read('punto_id')}) as res");
                    $resultado = explode('|', $res[0][0]['res']);
                    if ($resultado[0] == 'true') {
                        $objCot->query('COMMIT');
                        echo "1_{$objCot->id}_{$resultado[1]}";
                    } else {
                        $objCot->query('ROLLBACK');
                        echo "2_{$resultado[1]}";
                    }
                }
            }
        } else {
            $objCot->query('ROLLBACK');
            echo "2_";
        }
        $this->autoRender = false;
    }

}